;------------------------------------------------------------------------------ ; Port Definitionen ;------------------------------------------------------------------------------ DPORT .EQU P1 ; Displayport fr Daten D0..D3 E2 .EQU P3.1 ; Display: Enable 2 (4x40) E1 .EQU P3.2 ; Display: Enable 1 RW .EQU P3.3 ; Display: Read / Write RS .EQU P3.4 ; Display: Register Select ;------------------------------------------------------------------------------ ; Kontroller Konstanten ;------------------------------------------------------------------------------ CLEARDISP .EQU 001h CURSORHOME .EQU 002h ENTRYMODE .EQU 004h DISPCONTROL .EQU 00Ch FUNCTIONSET .EQU 020h CGRAMADR .EQU 040h DDRAMADR .EQU 080h ;------------------------------------------------------------------------------ ; Makro Definitionen ;------------------------------------------------------------------------------ #define DISPBEF CLR RS ; Befehlsmodus fr Display #define DISPDAT SETB RS ; Datenmodus fr Display #define DISPWRITE CLR RW ; Schreiben ins Display #define DISPREAD SETB RW ; Lesen vom Display ;------------------------------------------------------------------------------ ; Fhrt am Display einen Software Reset durch und schaltet in den 4-Bit Modus ; ; šbergabe: - ; Rckgabe: - ; ; Ver„nderte Register: A ;------------------------------------------------------------------------------ DISP_RESET: DISPBEF DISPWRITE SETB F_E1 ; Befehle fr Kontroller 1 SETB F_E2 ; und Kontroller 2 aktivieren MOV A,#15 ACALL WARTEMS ; warten MOV A,#3 ACALL NIBBLE_OUT ; in den 8-Bit Modus schalten MOV A,#6 ACALL WARTEMS MOV A,#3 ; jetzt ist Display sicher im 8-Bit Modus ACALL NIBBLE_OUT MOV A,#6 ACALL WARTEMS ; nun Software Reset MOV A,#3 ACALL NIBBLE_OUT MOV A,#6 ACALL WARTEMS MOV A,#3 ACALL NIBBLE_OUT MOV A,#6 ACALL WARTEMS MOV A,#3 ACALL NIBBLE_OUT MOV A,#6 ACALL WARTEMS MOV A,#2 ACALL NIBBLE_OUT ; in den 4-Bit Modus schalten CLR F_E2 RET ;------------------------------------------------------------------------------ ; Gibt ein Byte zum Display aus ; ; šbergabe: A = Auszugebendes Byte ; Rckgabe: - ; ; Ver„nderte Register: A,B ;------------------------------------------------------------------------------ BYTE_OUT: DISPWRITE ; R/W zum Schreiben setzen MOV B,A ; Byte in B merken SWAP A ; High-Nibble zuerst nach D0-D3 ; MOV DPORT,A ANL A,#00Fh ; D4-D7 ausblenden ANL DPORT,#0F0h ; Nibble am Port l”schen ORL DPORT,A ; neues Nibble an Port legen BYTO1: JNB F_E1,BYTO2 ; Kontroller 1 nicht aktiv weiter SETB E1 ; Enable Puls CLR E1 ; erzeugen BYTO2: JNB F_E2,BYTOLO ; Kontroller 2 nicht aktiv weiter SETB E2 ; Enable Puls CLR E2 ; erzeugen BYTOLO: ; MOV DPORT,B MOV A,B ANL A,#00Fh ; D4-D7 ausblenden ANL DPORT,#0F0h ; Nibble am Port l”schen ORL DPORT,A ; neues Nibble an Port legen BYTO3: JNB F_E1,BYTO4 ; Kontroller 1 nicht aktiv weiter SETB E1 ; Enable Puls CLR E1 ; erzeugen BYTO4: JNB F_E2,BYTOEND; Kontroller 2 nicht aktiv weiter SETB E2 ; Enable Puls CLR E2 ; erzeugen BYTOEND: RET ;------------------------------------------------------------------------------ ; Liest ein Byte vom Display ein ; ; šbergabe: - ; Rckgabe: A = Eingelesenes Byte ; ; Ver„nderte Register: B ;------------------------------------------------------------------------------ BYTE_IN: DISPREAD ; Display auf lesen stellen ORL DPORT,#00Fh ; Datenleitungen D0-D3 auf 1 setzen JNB F_E1,BYTIN2 ; Kontroller 1 nicht aktiv dann Kontroller 2 SETB E1 ; Enable auf 1 setzen SJMP BYTIN3 BYTIN2: SETB E2 ; Enable2 auf 1 setzen BYTIN3: MOV A,DPORT ; Display Port lesen CLR E1 ; Enable 1 oder CLR E2 ; Enable 2 wieder auf 0 setzen ANL A,#00Fh ; D4-D7 ausmaskieren SWAP A ; D0-D3 auf D4-D7 bringen MOV B,A ; in B merken JNB F_E1,BYTIN4 ; Kontroller 1 nicht aktiv dann Kontroller 2 SETB E1 ; Enable auf 1 setzen SJMP BYTIN5 BYTIN4: SETB E2 ; Enable2 auf 1 setzen BYTIN5: MOV A,DPORT ; Display Port lesen CLR E1 ; Enable 1 oder CLR E2 ; Enable 2 wieder auf 0 setzen ANL A,#00Fh ; D4-D7 ausmaskieren ORL A,B ; und mit High-Nibble verodern RET ;------------------------------------------------------------------------------ ; Gibt ein Nibble zum Display aus (R/W am Display muss bereits 0 sein!) ; ; šbergabe: A = Auszugebendes Nibble in D0-D3 ; Rckgabe: - ; ; Ver„nderte Register: A ;------------------------------------------------------------------------------ NIBBLE_OUT: ; MOV DPORT,A ANL A,#00Fh ; D4-D7 ausblenden ANL DPORT,#0F0h ; Nibble am Port l”schen ORL DPORT,A ; neues Nibble an Port legen NIBO1: JNB F_E1,NIBO2 ; Kontroller 1 nicht aktiv weiter SETB E1 ; Enable Puls CLR E1 ; erzeugen NIBO2: JNB F_E2,NIBOEND; Kontroller 2 nicht aktiv weiter SETB E2 ; Enable Puls CLR E2 ; erzeugen NIBOEND: RET